class: center, middle # Rails View Katmanı --- # Response(Cevap) Oluşturmak Controller katmanında HTTP response mesajı oluşturmak için 2 yöntem vardır, * `render` kullanarak bir HTML, JSON, XML formatında bir mesaj oluşturmak * `redirect_to` kullanarak HTTP redirect kodu göndermek --- # Render * Controller actionlarında Rails'ın conventionı varsayılan olarak aynı isimdeki view dosyasını render etmektir. `app/views/controller_adı/action_adı.html.erb` **Örnek** ```ruby class PlacesController < ApplicationController def show end end ``` `PlacesController`ın `show` actionı varsayılan olarak `app/views/places/show.html.erb` dosyasını render eder. --- # Başka bir view render etmek ```ruby class PlacesController < ApplicationController ... def update @place = Place.find(params[:id]) if @place.update(place_params) redirect_to place_path(place) else render "edit" end end ... end ``` --- # Sadece string render etmek ```ruby render plain: "OK" ``` --- # JSON render etmek ```ruby class PlacesController < ApplicationController ... def show @place = Place.find(params[:id]) render json: @place end ... end ``` Rails render ederken `@place` objesi üzerinde otomatik olarak `to_json` methodunu çağıracağı için sizin çağırmanıza gerek yoktur. `to_json` methodunu ActiveRecord sağlar. Aynı şekilde XML olarak da render edebiliriz. ```ruby render xml: @place` ``` --- # Layout değiştirmek Render ederken varsayılan layout dosyasından farklı bir layout kullanmak istiyorsak `layout` parametresini kullanabiliriz. ```ruby render layout: "admin_layout" ``` Ya da layout kullanmak istemeyebiliriz, ```ruby render layout: false ``` --- # Durum kodu belirtmek Rails otomatik olarak HTTP cevaplarını 200 kodu kullanarak oluşturur. Render ederken bunu değiştirebiliriz. ```ruby render status: 500 ``` ```ruby render status: :forbidden ``` --- # Controller için layout seçeneği Controller içerisinde tüm actionlarda geçerli olması için layout dosyası belirtebiliriz. ```ruby class PlacesController < ApplicationController layout "place_layout" ... end ``` Bu seçenek ile bu controller içerisindeki tüm actionlar layout olarak ` app/views/layouts/place_layout.html.erb` dosyasını kullanacak. --- # Controller için layout seçeneği Controller içerisindeki `layout` seçeneği o controllerdan extend edilen tüm controllerlar için geçerlidir. ```ruby class AdminController < ApplicationController layout "admin_layout" ... end class PlacesController < AdminController ... end class PagesController < AdminController ... end ``` `AdminController` layout olarak `admin_layout` dosyasını tanımlıyor ve ondan extend edilen `PlacesController` ve `PagesController` controllerları layout olarak yine aynı dosyayı kullanacak. --- # Controller için layout seçeneği `layout` seçeneği için `only` veya `except` parametrelerini kullanabiliriz. ```ruby class AdminController < ApplicationController layout "admin_layout", only: [:create] ... end ``` --- # redirect_to kullanımı `redirect_to` methodunu kullanarak kullanıcıları controller içerisinde başka bir sayfaya yönlendirebiliriz. Örneğin bir formu başarıyla kaydettikten sonra gerekli sayfaya yönlendirmek. ````ruby redirect_to root_path redirect_to places_path, notice: "Mekan başarıyla kaydedildi" ``` --- # Asset Tag Helperları View içerisinde javascript, css, image, video gibi assetleri ekleyebilmek için Rails helper methodları sağlar. * javascript_include_tag * stylesheet_link_tag * image_tag * video_tag * audio_tag --- # Asset Tag Helperları ```ruby <%= javascript_include_tag "main" %> ``` Kodu aşağıdaki HTML kodunu üretecektir; ```html ``` --- # Asset Tag Helperları ```ruby <%= image_tag "header.png" %> <%= image_tag "header.png", alt: "Home" %> <%= image_tag "header.png", class: "nav_bar" %> ``` --- # yield Kullanımı Layout dosyaları içerisindeki `yield`, view dosyalarından gelen içeriğin nereye ekleneceğini belirtir. `application.html.erb` ```html <html> <head> </head> <body> <%= yield %> </body> </html> ``` `places/show.html.erb` ```html
<%= @place.name %>
``` --- # yield Kullanımı Çıktısı; `application.html.erb` ```html <html> <head> </head> <body>
Starbucks
</body> </html> ``` --- Layout içerisinde birden fazla `yield` kullanabiliriz.; `application.html.erb` ```html <html> <head> <title> <%= yield :title %> </title> </head> <body> <%= yield %> </body> </html> ``` `yield :title` kullanarak view dosyalarımızda buraya gelecek içeriği belirleyebiliriz. `places/show.html.erb` ```html <% content_for :title do %> <%= @place.name %> Hakkında <% end %>
<%= @place.name %>
``` --- # Partial Kullanımı Partial kullanarak view dosyalarını parçalara ayırabiliriz. Böylece kodun daha yönetilebilir olmasını sağlar, kod tekrarlarının önüne geçebiliriz. Partial dosyalarını, template(`show.html.erb`, `index.html.erb`) dosyalarından ayırmak için dosya isimleri alt çizgi(`_`) ile başlar. Partial dosyalarını `render` methodunu kullanarak template içerisine ekleyebiliriz. ```ruby <%= render "menu" %> # _menu.html.erb dosyasını render eder ``` --- # Partial Kullanımı Partial render ederken, partial dosyası içerisinde kullanabilmek için yerel değişkenler tanımlayabiliriz. ```ruby <% @places.each do |place| <%= render "place", place: place %> # _place.html.erb dosyasını render eder. <% end %> ``` `_place.html.erb` ```ruby
<%= place.name %>
``` **Alternatif:** ```ruby <% @places.each do |place| <%= render "place", foo: place %> # _place.html.erb dosyasını render eder. <% end %> ``` `_place.html.erb` ```ruby
<%= foo.name %>
``` --- # Referanslar * http://guides.rubyonrails.org/layouts_and_rendering.html ---